package com.audioutils;

import android.app.IntentService;
import android.content.Intent;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;
//import org.greenrobot.eventbus.EventBus;

/**
 * Created by Administrator on 2019/4/4.
 */

public class AudioService extends IntentService{
    private static final String TAG = "AudioRecord";
    static final int SAMPLE_RATE_IN_HZ = 8000;

    static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
            AudioFormat.CHANNEL_IN_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);

    private AudioRecord mAudioRecord;
    boolean isGetVoiceRun;
    private Object mLock;

    public AudioService(){
        super("");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mLock = new Object();

        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,SAMPLE_RATE_IN_HZ,
                AudioFormat.CHANNEL_IN_DEFAULT,AudioFormat.ENCODING_PCM_16BIT, BUFFER_SIZE);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (isGetVoiceRun) {
            Log.e(TAG, "还在录着呢");
            return;
        }

        if (mAudioRecord == null) {
            Log.e(TAG, "mAudioRecord初始化失败");
        }
        isGetVoiceRun = true;
        execute();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        isGetVoiceRun=false;
        mAudioRecord.stop();
        mAudioRecord.release();
        mAudioRecord = null;
    }

    private void execute(){
        mAudioRecord.startRecording();
        short[] buffer = new short[BUFFER_SIZE];
        while (isGetVoiceRun) {
            //r是实际读取的数据长度，一般而言r会小于buffersize
            int r = mAudioRecord.read(buffer, 0, BUFFER_SIZE);
            long v = 0;
            // 将 buffer 内容取出，进行平方和运算
            for (int i = 0; i < buffer.length; i++) {
                v += buffer[i] * buffer[i];
            }
            // 平方和除以数据总长度，得到音量大小。
            double mean = v / (double) r;
            double volume = 10 * Math.log10(mean);

            /**
             * 将文件路径发送到主线程
             */
            //EventBus.getDefault().post(new DBEvent((int)volume));

            Log.d(TAG, "分贝值:" + volume);
            // 大概一秒十次
            synchronized (mLock) {
                try {
                    mLock.wait(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}